主题
概念卡片:Dubbo SPI扩展机制
一句话机制:Dubbo 是「微内核 + SPI 扩展」设计——内核只负责把「接口 → 实现类」的映射做成可插拔,协议、集群、路由、序列化全是扩展点;它把 Java SPI 增强为按 key 延迟加载 + IOC/AOP + 自适应扩展,让二次开发不改源码、零侵入。
SPI 是什么
SPI(Service Provider Interface)是一种服务发现机制:把接口实现类的全限定名写进配置文件,加载时读配置、动态为接口替换实现类。Dubbo 的协议、集群、路由、序列化等全部通过 SPI 实现可插拔。
三类配置文件目录
| 目录 | 用途 |
|---|---|
META-INF/services/ | 兼容 Java SPI 的配置 |
META-INF/dubbo/ | 用户自定义 SPI 配置(key=com.xxx.xxx) |
META-INF/dubbo/internal/ | Dubbo 内部 SPI 配置 |
通过 ExtensionLoader.getExtensionLoader(Xxx.class).getExtension("key") 按 key 加载指定实现。
Java SPI vs Dubbo SPI
| 维度 | Java SPI | Dubbo SPI |
|---|---|---|
| 加载方式 | 一次性全量实例化所有实现 | 延迟加载,按 key 只加载需要的 |
| 扩展成本 | 需改源码/全量加载 | 不改源码,classpath 加文件即可 |
| 依赖注入 | 无 | IOC:扩展点可用 setter 注入其他扩展点 |
| 增强能力 | 无 | AOP:扩展点可被包装/代理增强 |
| 自适应 | 无 | 自适应扩展(Adaptive):调用时按 URL 参数动态决定实现类 |
| 容器集成 | — | 兼容第三方 IoC 容器(默认支持 Spring Bean) |
自适应扩展(Adaptive)
ExtensionLoader 生成动态代理类(createAdaptiveExtensionClassCode),调用时从 URL 参数取值作为 key 决定实际实现类——这就是"运行时按配置自动选实现"的底层机制。代价:动态代理让调试变难,需分析出实际调用的实现类。
分层架构(微内核的骨架)
大三层:Business(业务,自写接口实现)→ RPC(调用核心:负载均衡/集群容错/代理)→ Remoting(网络传输与数据转换);Service/Config 属 API 层(给使用者),其余层属 SPI 层(给扩展者做二次开发)。
细分 10 层:Service → Config → Proxy → Registry → Cluster → Monitor → Protocol → Exchange → Transport → Serialize(由上至下依赖)。
设计模式在 Dubbo 中的运用
| 模式 | 位置 |
|---|---|
| 责任链 | Filter 链(ProtocolFilterWrapper 串起所有 Filter),Dubbo 骨架——监控/日志/缓存/安全都是 Filter |
| 装饰器 | ProtocolFilterWrapper 修饰 Protocol;ListenerInvokerWrapper/InvokerWrapper 等 |
| 观察者 | Registry 订阅:Consumer subscribe 注册观察者,地址变化经 NotifyListener 通知 |
| 代理 | ProxyFactory 生成本地代理,屏蔽网络细节(JDK Proxy / Javassist) |
| 工厂方法 | CacheFactory(AbstractCacheFactory 抽象 + 子类 createCache) |
| 抽象工厂 | ProxyFactory(生产 Proxy 与 Invoker) |
| 适配器 | 日志组件适配(jcl/jdk/log4j/slf4j) |
不变量(必须成立的约束)
- 一切皆扩展点:协议/集群/路由/序列化/负载均衡/Filter 都可 SPI 替换,内核不写死。
- 延迟加载:只实例化被使用的扩展,避免 Java SPI 全量加载的资源浪费。
- Adaptive 实现由动态代理生成,具体调哪个实现在运行时由 URL 参数决定。
常见误解
- 以为 Dubbo SPI 就是 Java SPI → Dubbo 是对 Java SPI 的增强(延迟加载 + IOC/AOP + 自适应),不是原样使用。
- 以为扩展 Dubbo 要改源码 → 在 classpath 加
META-INF/dubbo/配置文件 + 实现类即可,代码零侵入。 - 以为 Filter 只是过滤 → Filter 是责任链,承载监控、日志、缓存、限流、安全等横切能力。
关联
- 调用链:[概念卡片:Dubbo RPC框架](./概念卡片:Dubbo RPC框架)
- 容错与协议:概念卡片:Dubbo集群容错与负载均衡
- 总览:RPC技术栈总览
- 面试:面试题蒸馏卡:Dubbo